

let express = require("express");
var path = require("path");
var fsp = require("fs/promises");

let Router = express.Router();  // 通过exprss创建路由(用法同app)

var db = path.join(__dirname, "../data");

Router.get("/", function (req, res) {
    fsp.readFile(path.join(db, "./userinfo.json"), "utf-8").then((list) => { // 读取文件时返回的就是文本(json字符串)
        // res.end(list); // http模块内置的

        list = list || "[]";

        // express中封装的
        res.send(list);
    }).catch(err => {
        res.send(JSON.stringify(err))
    })
})


// 中间件函数
function validateField(key, method = "get") {
    return function (req, res, next) {
        let data = method == "get" ? req.query : req.body;

        if (Object.hasOwn(data, key)) {  // 存在此字段
            next();
        } else {
            res.send({
                code: 100,
                message: "请传入完整参数:" + key,
            })
        }
    }

}



Router.get("/isExistUser", validateField("user"), function (req, res) {
    let { user } = req.query;

    // Object.hasOwn(req.query, "user")  判断对象中是否存在键名(字段名),不考虑健值
    // var user = req.query.user  // 取req.query的user属性的属性值

    // 注册之前需要判断用户名 手机号 邮箱是否存在  => 存在就不能注册
    fsp.readFile(path.join(db, "./userinfo.json"), "utf-8").then((result) => {

        result = result || "[]";  // 如果userinfo中不存在任何内容(读取后"") 默认空数组 ("字符串")
        list = JSON.parse(result); // 将json字符串转化为 js对象(数组)

        if (!list.find(v => v.user == user)) {
            res.send({
                code: 200,
                message: "可以使用的用户名",
            })
        } else {
            res.send({
                code: 300,
                message: "用户名已被注册",
            })
        }

    }).catch(err => {
        res.send({
            code: 500,
            message: "读取失败",  // 服务器内部读取文件失败
            error: err.message // err 错误对象 err.message 报错的信息
        })
    })

})

Router.get("/isExistPhone", function (req, res) {
    if (Object.hasOwn(req.query, "phone")) {
        let { phone } = req.query;

        // 注册之前需要判断用户名 手机号 邮箱是否存在  => 存在就不能注册
        fsp.readFile(path.join(db, "./userinfo.json"), "utf-8").then((result) => {

            result = result || "[]";  // 如果userinfo中不存在任何内容(读取后"") 默认空数组 ("字符串")
            list = JSON.parse(result); // 将json字符串转化为 js对象(数组)

            if (!list.find(v => v.phone == phone)) {
                res.send({
                    code: 200,
                    message: "可以使用的手机号",
                })
            } else {
                res.send({
                    code: 300,
                    message: "手机号已被注册",
                })
            }

        }).catch(err => {
            res.send({
                code: 500,
                message: "读取失败",  // 服务器内部读取文件失败
                error: err.message // err 错误对象 err.message 报错的信息
            })
        })
    } else {
        res.send({
            code: 100,
            message: "请传入完整参数",
        })
    }
})

Router.get("/isExistEmail", function (req, res) {
    if (Object.hasOwn(req.query, "email")) {
        let { email } = req.query;

        // 注册之前需要判断用户名 手机号 邮箱是否存在  => 存在就不能注册
        fsp.readFile(path.join(db, "./userinfo.json"), "utf-8").then((result) => {

            result = result || "[]";  // 如果userinfo中不存在任何内容(读取后"") 默认空数组 ("字符串")
            list = JSON.parse(result); // 将json字符串转化为 js对象(数组)

            if (!list.find(v => v.email == email)) {
                res.send({
                    code: 200,
                    message: "可以使用的邮箱",
                })
            } else {
                res.send({
                    code: 300,
                    message: "邮箱已被注册",
                })
            }

        }).catch(err => {
            res.send({
                code: 500,
                message: "读取失败",  // 服务器内部读取文件失败
                error: err.message // err 错误对象 err.message 报错的信息
            })
        })
    } else {
        res.send({
            code: 100,
            message: "请传入完整参数",
        })
    }
})


// 用户新增: 
// 接收用户传入的数据, 存储到数据库(userinfo)  
// 分析:  需要存储 user pwd phone email  nickIcon(头像 默认"")

// 流程:
// 注册之前需要判断用户名 手机号 邮箱是否存在  => 存在就不能注册
// 都不存在 => 可以注册

// post类型接口 接收数据的方式和get不一样(需要额外处理)  => post接口不好直接测试
// (1) 先写成get 在改为post (今天建议)
// (2) 自己新建页面 发送ajax请求  (low) 
// (3) 接口测试工具 postman

Router.post("/add", validateField("user", "post"), validateField("pwd", "post"), validateField("phone", "post"), validateField("email", "post"), function (req, res) {
    // let data = { user: "a123123", pwd: 123123, phone: "17386141516", email: "a123123@qq.com" }; //模拟前端传入的数据
    let data = req.body; // 浏览器以post方式传递的数据
    console.log("接收的数据", data);

    // 注册之前需要判断用户名 手机号 邮箱是否存在  => 存在就不能注册
    fsp.readFile(path.join(db, "./userinfo.json"), "utf-8").then((result) => {

        result = result || "[]";  // 如果userinfo中不存在任何内容(读取后"") 默认空数组 ("字符串")
        list = JSON.parse(result); // 将json字符串转化为 js对象(数组)

        if (list.length > 0) { // 有数据
            if (list.find(v => v.user == data.user)) {
                res.send({
                    code: 300,
                    message: "用户名已被注册",
                })
            } else if (list.find(v => v.phone == data.phone)) {
                res.send({
                    code: 300,
                    message: "手机号已被注册",
                })
            } else if (list.find(v => v.email == data.email)) {
                res.send({
                    code: 300,
                    message: "邮箱已被注册",
                })
            } else {
                list.push(data);
                fsp.writeFile(path.join(db, "./userinfo.json"), JSON.stringify(list), { encoding: "utf-8", flag: "w" }).then(() => {
                    res.send({
                        code: 200,
                        message: "注册成功",
                    })
                }).catch(err => {
                    res.send({
                        code: 300,
                        message: "注册失败",
                        error: err.message // err 错误对象 err.message 报错的信息
                    })
                })

            }

        } else { // 没有数据 => 数据库中一条数据都没有
            list.push(data);

            fsp.writeFile(path.join(db, "./userinfo.json"), JSON.stringify(list), { encoding: "utf-8", flag: "w" }).then(() => {
                res.send({
                    code: 200,
                    message: "注册成功",
                })
            }).catch(err => {
                res.send({
                    code: 300,
                    message: "注册失败",
                    error: err.message // err 错误对象 err.message 报错的信息
                })
            })

        }



    }).catch(err => {
        res.send({
            code: 500,
            message: "读取失败",  // 服务器内部读取文件失败
            error: err.message // err 错误对象 err.message 报错的信息
        })
    })


})

// post  /user/login     
// 参数:  user  pwd  

// (1) 参数校验
// (2) 对应用户查找用户是否存在   不存在:用户未注册
// (3) 存在  判断密码是否正确   正确: 登录成功  密码有误:用户名或密码有误

Router.post("/login", async function (req, res) {
    // let data = { user: "a12313", pwd: "123123" }
    // let data = req.body;

    if (Object.hasOwn(req.body, "user") && Object.hasOwn(req.body, "pwd")) {
        let { user, pwd } = req.body;  // 用户传入的

        // (1) 判断用户是否注册
        try {
            var list = await fsp.readFile(path.join(db, "./userinfo.json"), "utf-8");  // 读取的字符串
            list = JSON.parse(list); //转数组

            var info = list.find(v => v.user == user);

            if (info) {
                if (info.pwd == pwd) {
                    res.send({
                        code: 200,
                        message: "登录成功",
                    })
                } else {
                    res.send({
                        code: 300,
                        message: "用户名或密码有误",
                    })
                }

            } else {
                res.send({
                    code: 300,
                    message: "用户未注册",
                })
            }




        } catch (err) { // 文件读取失败
            res.send({
                code: 300,
                message: err.message,
            })
        }





    } else {
        res.send({
            code: 100,
            message: "请传入完整参数",
        })
    }


})



// post  /grade/add
// get   /grade/searchGradeById
// get   /grade/del
// post   /grade/update


module.exports = Router;





